Cache memories are commonly utilized to improve the performance of data processors that must access data located in slow and/or distant main memory. A cache memory is typically much smaller than a main memory, but substantially faster. When a data processor needs to read data from memory, it first determines whether that memory location is stored in a cache memory. If the processor finds that the memory location is in the cache memory, a “cache hit” occurs and the data processor reads the data from the faster cache memory. If, on the other hand, the data is not available in the cache memory, a “cache miss” occurs. A cache miss slows execution while the required data is fetched from the slower main memory. The fetched data is also typically stored in the cache memory for later use.
Many applications utilize memory caches to function as buffers of data. Buffers that are assumed to be initialized in advance with known values are commonly called “preset buffers.” Only new or different values are typically written to these preset buffers while an application is executed. Less sophisticated forms of these applications may simply initialize a preset buffer by writing default values (e.g., logical zeros) to memory. During these writes, a series of cache misses occurs while the preset buffer is installed in the cache memory. Those cache misses cause an increase in program execution cycles and also consume power. More advanced forms of these applications, in contrast, may attempt to pre-fetch data into the preset buffer in order to populate the cache memory with preset data before an application is started, or very soon thereafter. The presence of the preset data in the cache memory avoids the need to populate the preset buffer solely by cache misses. Delays due to cache misses are thereby reduced. Despite this benefit, however, pre-fetching data in this manner, even if done in background, can delay the treatment of regular cache misses, and also does not save the power required to access the main memory.